<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>Makefile and our coding life</title>
    <meta name="description" content="A framework for easily creating beautiful presentations using HTML">
    <meta name="author" content="Hakim El Hattab">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">

    <link rel="stylesheet" href="css/reveal.css">
    <link rel="stylesheet" href="css/theme/black.css" id="theme">
    <!-- Code syntax highlighting -->
    <link rel="stylesheet" href="lib/css/zenburn.css">
    <!-- Printing and PDF exports -->
    <script>
    var link = document.createElement('link');
    link.rel = 'stylesheet';
    link.type = 'text/css';
    link.href = window.location.search.match(/print-pdf/gi) ? 'css/print/pdf.css' : 'css/print/paper.css';
    document.getElementsByTagName('head')[0].appendChild(link);
    </script>
</head>

<body>
    <div class="reveal">
        <!-- Any section element inside of this container is displayed as a slide -->
        <div class="slides">
            <section >
                 <h1> Makefile </h1>
            </section>

            <section data-markdown>
                ## Makefile概述 
                * 在我的理解中, `Makefile`就是让用户在不需要`IDE`的情况下, 轻松构建代码结构, 但是现在的`IDE`做了太多了工作, 以至于我们都不了解一个程序是如何被编译, 被链接, 以及被执行的, 对于我们来说, 了解`IDE`是怎样进行工作的是很有必要的
            </section>

            <section>
                <h2> 先来贴一小段代码</h2>
                <pre><code class="hlc" data-trim contenteditable>
#define UNICODE
#define _WIN32_WINNT   		        0x0A00
#include "afxwin.h"
#include "windows.h"

int WINAPI WinMain(HINSTANCE hIstance, HINSTANCE hPrevInstance,
			LPSTR szCmdLine, int iCmdShow)
{
	AfxMessageBox(_T("Hello world"));
	//MessageBox(0, L"Hello MessageBox", L"My app:", MB_SETFOREGROUND);
	return 0;
}
				</code></pre>
            </section>
            <section data-markdown>
                > 有了代码之后, `VS`到底是怎么样实现编译,链接,以及执行我们的代码的吗? 
                ``` 
                cl /EHsc /Femy.exe test.cpp 
                # 另一种方式 
                cl /EHsc /c test.cpp /Fomy.obj #编译过程 
                link my.obj /OUT:my.exe #链接过程 
                ```

            </section>
            <section data-markdown>
                ### 接下来要换工具了, 微软的`cl`并不是跨平台软件青睐的编译器, 因为标准已经被`gcc`玩坏了
            </section>
            <section data-markdown>
                #### Makefile基础用法 
                ```
                makefile target... :  requisites...
                	command 
                ```
            </section>
            <section data-markdown>
                > `Makefile`的第一大优点: 

                * 更改了一个文件之后它不会重新编译整个项目.
            </section>
            <section data-markdown>
                > 第二大优点: 

                * 阅读源码的人, 可以清晰的从`Makefile`中观察到程序的构建方式,
            </section>
            <section data-markdown>
                > 第三大优点 

                * 通用的源码包安装, 几乎所有的开源软件的安装都是通过`Makefile`
            </section>
            <section data-markdown>
                ## 中场休息广告

                `Manjaro`你值得拥有

                https://manjaro.org/

                `Synapse` 同样值得拥有   

                https://launchpad.net/synapse-project
            </section>

            <section data-markdown>
                ## 动态链接库与静态链接库

                > $^：代表所有的依赖文件

                > $@：代表目标

                > $<：代表第一个依赖文件
                
            </section>

            <section>
                <h2>对微软的吐槽</h2>
                <p>尽管我们的世界基本上被`IDE`统治了, 但总会有那么一些人, 怀念着`makefile`, `vim/emacs`, `g++/gcc/gdb`所带来的便利, 优秀的设计从来都不会褪色.
                <p>现在基本上`linux`上所有的程序员基本上都能轻松的使用`gcc/g++`, 甚至熟练的使用`vim/emacs`, 可是这个世界上, 有多少`windows`的程序员还能用`visual basic`写出一行代码, 这不是语言的差异, 这是思想的差距.
            </section>
            <section data-markdown>
                ### 最后, 我再来介绍一下`Linux`中的三行情诗 

                ```bash 
                ># wget http://ftp.gnu.org/gnu/tar/tar-latest.tar.xz # 下载tar的源码包 
                ># xz -d tar-latest.tar.xz tar -xvf tar-latest.tar 

                ># ./configure
                ># make
                ># make install 
                ```
            </section>
        </div>
    </div>
    <script src="lib/js/head.min.js"></script>
    <script src="js/reveal.js"></script>
    <script>
    // Full list of configuration options available at:
    // https://github.com/hakimel/reveal.js#configuration
    Reveal.initialize({
        controls: true,
        progress: true,
        history: true,
        center: true,

        //transition: 'slide', // none/fade/slide/convex/concave/zoom
        transition: 'convex', // none/fade/slide/convex/concave/zoom

        // Optional reveal.js plugins
        dependencies: [{
            src: 'lib/js/classList.js',
            condition: function() {
                return !document.body.classList;
            }
        }, {
            src: 'plugin/markdown/marked.js',
            condition: function() {
                return !!document.querySelector('[data-markdown]');
            }
        }, {
            src: 'plugin/markdown/markdown.js',
            condition: function() {
                return !!document.querySelector('[data-markdown]');
            }
        }, {
            src: 'plugin/highlight/highlight.js',
            async: true,
            callback: function() {
                hljs.initHighlightingOnLoad();
            }
        }, {
            src: 'plugin/zoom-js/zoom.js',
            async: true
        }, {
            src: 'plugin/notes/notes.js',
            async: true
        }]
    });
    </script>
</body>

</html>
